package sm.pzavoli.std;

import java.util.HashMap;
import java.util.Iterator;

import sm.pzavoli.mercato.MercatoDBOpenHelper;
import android.database.Cursor;
import android.util.Log;

public class DMC {
	MercatoDBOpenHelper m_db;
	public DMC(MercatoDBOpenHelper db) {
		m_db = db;
	}
	public boolean load(StdPojo pojo, String select) {
		try {
	        if (m_db == null) {
	            Log.e("DMC", "db is null");
	            return false;
	        }
	        //SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
	        //HashMap<String, ProprietaAttributo> map = pojo.getPropAttributi();	        
	        //ProprietaAttributo columns[] = (ProprietaAttributo[]) map.values().toArray();
	        Cursor c = m_db.getReadableDatabase().rawQuery(select, null);
	        try {
		        while ( c.moveToNext()) {
		        	HashMap<String,Object> mappa = new HashMap<String,Object>();
		        	int numcols = c.getCount();
		        	for ( int i = 0; i < numcols; i++) {
		        		String nome = c.getColumnName(i);
		        		int coltyp = c.getType(i);
		        		Object o = null;
		        		switch (coltyp) {
		        		case Cursor.FIELD_TYPE_FLOAT:
		        			o = c.getDouble(i);
		        			break;
		        		case Cursor.FIELD_TYPE_INTEGER:
		        			o = c.getLong(i);
		        			break;
		        		case Cursor.FIELD_TYPE_STRING:
		        			o = c.getString(i);
		        			break;
		        		case Cursor.FIELD_TYPE_NULL:
		        			o = null;
		        			break;
		        		case Cursor.FIELD_TYPE_BLOB:
		        			o = c.getBlob(i);
		        			break;		        			
		        		}
		        		mappa.put(nome, o);
		        	}
		        	return loadFromCursor(pojo, mappa);
		        }
	        } catch(Exception e) {
	        	e.printStackTrace();
	        	Log.e("DMC","load andata male:"+e.getMessage());
	        	return false;
	        } finally {
	        	c.close();
	        }
	        return true;
		} catch(Exception e) {
			e.printStackTrace();
			Log.e("DMC", "Errore in esecuzione query:"+select);
			return false;
		}
	}
	
	/*
	 * Carica la lista selezionata dal db utilizzando la select passata.
	 */
	public boolean load(Lista lista, String select) {
		try {
	        if (m_db == null) {
	            Log.e("DMC", "db is null");
	            return false;
	        }
	        Cursor c = m_db.getReadableDatabase().rawQuery(select, null);
	        try {
		        while ( c.moveToNext()) {
		        	HashMap<String,Object> mappa = new HashMap<String,Object>();
		        	int numcols = c.getColumnCount();
		        	for ( int i = 0; i < numcols; i++) {
		        		String nome = c.getColumnName(i).toLowerCase();
		        		int coltyp = c.getType(i);
		        		Object o = null;
		        		switch (coltyp) {
		        		case Cursor.FIELD_TYPE_FLOAT:
		        			o = c.getDouble(i);
		        			break;
		        		case Cursor.FIELD_TYPE_INTEGER:
		        			o = c.getLong(i);
		        			break;
		        		case Cursor.FIELD_TYPE_STRING:
		        			o = c.getString(i);
		        			break;
		        		case Cursor.FIELD_TYPE_NULL:
		        			o = null;
		        			break;
		        		case Cursor.FIELD_TYPE_BLOB:
		        			o = c.getBlob(i);
		        			break;		        			
		        		}
		        		mappa.put(nome, o);
		        	}
		        	if ( !loadFromCursor(lista, mappa))
		        		return false;
		        }
	        } catch(Exception e) {
	        	e.printStackTrace();
	        	Log.e("DMC","load andata male:"+e.getMessage());
	        	return false;
	        } finally {
	        	c.close();
	        }	        
	        return true;
		} catch(Exception e) {
			e.printStackTrace();
			Log.e("DMC","loadLista errore:"+e.getMessage());
			return false;
		}
	}
	private boolean loadFromCursor(StdPojo pojo, HashMap<String,Object> mappa) {
		try {
	        HashMap<String, ProprietaAttributo> map = pojo.getPropAttributi();	        
	        Object columns[] = map.values().toArray();
        	// Prima riempio il pojo corrente
        	for (int i = 0; i < columns.length; i++) {
        		ProprietaAttributo p = (ProprietaAttributo )columns[i];
        		if ( !p.isCalcolato()) {
        			String nome = p.getNome().toLowerCase();
        			Object o = mappa.get(nome);
        			pojo.getAttributi().get(nome).setValue(o);
        		}
        	}
        	// Poi verifico se ha eventuali Relazioni aperte e riempio anche quelle
        	HashMap<String, Relazione> relazioni = pojo.getRelazioni();
        	Iterator<Relazione> ite = relazioni.values().iterator();
        	while ( ite.hasNext()) {
        		Relazione r = ite.next();
        		if ( !r.isAttiva())
        			continue;
        		if ( r instanceof Relazione1) {
        			StdPojo figlio = ((Relazione1)r).getPDCCollegato();
        			if ( figlio != null) {
        				if ( !loadFromCursor(figlio, mappa))
        					return false;
        			}
        		} else {
        			RelazioneN reln = (RelazioneN) r;
        			Lista lista = reln.getListaPojo();
    				if ( !loadFromCursor(lista, mappa))
    					return false;        	
        		}
        	}
			return true;
		} catch(Exception e) {
			e.printStackTrace();
			Log.e("DMC","Errore in loadFromCursor:"+e.getMessage());
			return false;
		}
	}

	private boolean loadFromCursor(Lista lista, HashMap<String,Object> mappa) {
		try {
	        StdPojo pojo = lista.createNewPojo();
	        HashMap<String, Attributo> map = pojo.getAttributi();	   
	        Object attribs[] = map.values().toArray();
        	// Prima riempio il pojo corrente
        	for (int i = 0; i < attribs.length; i++) {
        		Attributo attr = (Attributo ) attribs[i];
        		ProprietaAttributo p = attr.getProp();
        		if ( !p.isCalcolato()) {
        			String nome = p.getNome().toLowerCase();
        			Object o = mappa.get(nome);
        			pojo.getAttributi().get(nome).setValue(o);
        		}
        	}
        	StdPojo pojonew = pojo;
        	if ( lista.contains(pojo.getKeyString())) {
        		pojonew = lista.get(pojo.getKeyString());
        	} else {
        		lista.add(pojonew);
        	}
        	return loadFromCursor(pojonew, mappa);
		} catch(Exception e) {
			e.printStackTrace();
			Log.e("dmc","loadFromCursor errore:"+e.getMessage());
			return false;
		}
	}
}
